package health_system.health_system.entity;

import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.*;

import java.time.LocalDateTime;

/**
 * 用户登录记录实体类
 * 记录用户的登录信息，包括设备信息、IP地址、登录时间等
 */
@Entity
@Table(name = "login_records")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class LoginRecord extends BaseEntity {

    /**
     * 关联的用户
     */
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id", nullable = false)
    private User user;

    /**
     * 登录设备类型：MOBILE（移动设备）、DESKTOP（桌面设备）、TABLET（平板电脑）、UNKNOWN（未知设备）
     */
    @Enumerated(EnumType.STRING)
    @Column(nullable = false)
    private DeviceType deviceType;

    /**
     * 设备名称/型号，例如"iPhone 12"、"Samsung Galaxy S21"、"Windows PC"等
     */
    @Size(max = 100)
    @Column(length = 100)
    private String deviceName;

    /**
     * 操作系统，例如"iOS 15.0"、"Android 11"、"Windows 10"等
     */
    @Size(max = 50)
    @Column(length = 50)
    private String operatingSystem;

    /**
     * 浏览器信息，例如"Chrome 96.0.4664.93"、"Safari 15.0"等
     */
    @Size(max = 100)
    @Column(length = 100)
    private String browser;

    /**
     * 登录IP地址
     */
    @NotNull
    @Size(max = 45) // 兼容IPv6地址长度
    @Column(nullable = false, length = 45)
    private String ipAddress;

    /**
     * 地理位置信息，例如"中国北京"、"美国纽约"等
     * 可以通过IP地址解析得到
     */
    @Size(max = 100)
    @Column(length = 100)
    private String location;

    /**
     * 登录状态：SUCCESS（成功）、FAILED（失败）
     */
    @Enumerated(EnumType.STRING)
    @Column(nullable = false)
    private LoginStatus loginStatus;

    /**
     * 登录失败原因，例如"密码错误"、"账号已锁定"等
     * 当登录状态为FAILED时记录
     */
    @Size(max = 255)
    private String failReason;

    /**
     * 登录时间
     */
    @NotNull
    @Column(nullable = false)
    private LocalDateTime loginTime;

    /**
     * 会话标识符，可用于跟踪用户会话
     */
    @Size(max = 100)
    @Column(length = 100)
    private String sessionId;

    /**
     * 用户代理信息（完整的User-Agent字符串）
     */
    @Column(columnDefinition = "TEXT")
    private String userAgent;

    /**
     * 设备类型枚举
     */
    public enum DeviceType {
        MOBILE, DESKTOP, TABLET, UNKNOWN
    }

    /**
     * 登录状态枚举
     */
    public enum LoginStatus {
        SUCCESS, FAILED
    }
} 